package br.com.affero.action;

import br.com.affero.form.DocumentoForm;
import br.com.affero.model.bean.Documento;
import br.com.affero.model.bean.Usuario;
import br.com.affero.model.bo.DocumentoBO;
import br.com.affero.model.bo.UsuarioBO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

public class DocumentoAction extends DispatchAction {
    
    private DocumentoBO documentoBO = DocumentoBO.getInstance();
    private UsuarioBO usuarioBO = UsuarioBO.getInstance();
    
    public ActionForward listar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        DocumentoForm documentoForm = (DocumentoForm) form;
        documentoForm.setListaDocumentos(documentoBO.obterListaDocumentos());
        documentoForm.setTamanhoLista(documentoForm.getListaDocumentos().size());
        return mapping.findForward("success");
    }
    
    public ActionForward novoDocumento(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        DocumentoForm documentoForm = (DocumentoForm) form;
        documentoForm.setListaUsuarios(usuarioBO.obterListaUsuarios());
        documentoForm.setMethod("inserir");
        return mapping.findForward("success");
    }
    
    public ActionForward excluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        Integer codigoDocumento = Integer.parseInt(request.getParameter("codigoDocumento"));
        
        Documento doc = new Documento();
        doc.setCodigo(codigoDocumento);
        
        documentoBO.excluir(doc);
        
        return mapping.findForward("deleteSuccess");
    }
    
    public ActionForward inserir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        DocumentoForm documentoForm = (DocumentoForm) form;
        
        Documento doc = new Documento();
        doc.setUsuario(new Usuario());
        doc.getUsuario().setCodigo(Integer.parseInt(documentoForm.getUsuarioSelecionado()));
        doc.setNomeDocumento(documentoForm.getFile().getFileName());
        doc.setDescricao(documentoForm.getDescricao());
        
        /** Documento persistido com Hibernate. */
        doc.setDocumento(documentoForm.getFile().getFileData());
        
        documentoBO.inserir(doc);
        
        return mapping.findForward("insertSuccess");
    }
    
    public ActionForward alterar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        DocumentoForm documentoForm = (DocumentoForm) form;
        
        Documento doc = documentoBO.obterDocumento(Integer.parseInt(documentoForm.getCodigoDocumento()));
        
        /** Ao alterar os dados de um documento, o arquivo persistido é alterado apenas 
            se um novo arquivo for selecionado */
        if (documentoForm.getFile().getFileData().length > 0) {
            doc.setDocumento(documentoForm.getFile().getFileData());
            doc.setNomeDocumento(documentoForm.getFile().getFileName());
        }
        doc.setDescricao(documentoForm.getDescricao());
        doc.getUsuario().setCodigo(Integer.parseInt(documentoForm.getUsuarioSelecionado()));
        
        documentoBO.alterar(doc);
        
        return mapping.findForward("updateSuccess");
    }
    
    public ActionForward exibirFormAlterar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        DocumentoForm documentoForm = (DocumentoForm) form;
        documentoForm.setListaUsuarios(usuarioBO.obterListaUsuarios());
        
        Integer codigoDocumento = Integer.parseInt(request.getParameter("codigoDocumento"));
        
        Documento doc = documentoBO.obterDocumento(codigoDocumento);
        documentoForm.setNomeDocumento(doc.getNomeDocumento());
        documentoForm.setFile(null);
        documentoForm.setCodigoDocumento(codigoDocumento.toString());
        documentoForm.setDescricao(doc.getDescricao());
        documentoForm.setUsuarioSelecionado(doc.getUsuario().getCodigo().toString());
        documentoForm.setMethod("alterar");
        
        return mapping.findForward("success");
    }
    
}
